package com.cjr.redis.mine;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Repository;

import java.util.Set;

/**
 * 将数据存储到redis数据库中,根据用户端用户的点击次数对权重(score)值自增1
 */
@Repository
@Slf4j
public class saveInfoToRedis {
    @Autowired
    private StringRedisTemplate redisTemplate;

    public Set<String> saveInfoToRedis(String keyWord){

        /**
         * redisTemplate.opsForZSet().reverseRank("test:zSet",keyWord)
         * 获取指定的参数排名位置(根据value值来获取)，可以作为判断该数值是否已经存在的依据
         *  1、无该value则返回null，
         *  2、有则返回具体的位置排行从0开始计算
         */
        Long value = redisTemplate.opsForZSet().reverseRank("test:zSet",keyWord);
        log.info("数据存放位置(从0开始)为:{}",value);

        if(value == null){
            /**
             * redis返回null说明无该value
             * 将数据存放到redis的zset数据结构中，
             * 存储格式为(key:"test:zSet",value:keyWord,score:"权重")
             */
            Boolean result = redisTemplate.opsForZSet().add("test:zSet",keyWord,30);
            log.info("存储结果为:{}",result);
        }else{
            /**
             * redis中存在该value值
             * redisTemplate.opsForZSet().incrementScore("test:zSet",keyWord,1);
             * 数据存在的情况下对value的权重自增1
             */
            Double resultValue = redisTemplate.opsForZSet().incrementScore("test:zSet",keyWord,Double.valueOf(1));
            log.info("当前权重值为:{}",resultValue);
        }

        /**
         * 获取redis中存储的数值
         * 存储的权重值为0-100的数值，降序排序
         */
        Set<String> sets =  redisTemplate.opsForZSet().reverseRangeByScore("test:zSet",0,100);
        log.info("0-100的权重从降序排序集合{}",sets);


        /**
         * redisTemplate.opsForZSet().reverseRange("test:zSet",0,2);
         * 根据排名返回数据从0开始计算，不返回权重
         * 返回前三条数据
         */
        Set<String> redisValue = redisTemplate.opsForZSet().reverseRange("test:zSet",0,2);
        for (String set: redisValue) {
            log.info("返回的数据有:{}",set);
        }

        /**
         * 返回前四条热词的参数值，并返回权重值
         *  redisTemplate.opsForZSet().reverseRangeWithScores("test:zSet", 0, 3);
         */
        Set<ZSetOperations.TypedTuple<String>> redisValues = redisTemplate.opsForZSet().reverseRangeWithScores("test:zSet", 0, 10);
        log.info("返回的集合为:{}",redisValue);
        for (ZSetOperations.TypedTuple<String> set: redisValues) {
            log.info("数据返回的value为:{},权重(score)为:{}",set.getValue(),set.getScore());
        }

        return sets;
    }
}
